package cn.wolfcode.business.controller;

import cn.wolfcode.business.domain.BusServiceItem;
import cn.wolfcode.business.domain.vo.AuditInfoVO;
import cn.wolfcode.business.domain.vo.AuditVo;
import cn.wolfcode.business.service.IBusServiceItemService;
import cn.wolfcode.common.annotation.Log;
import cn.wolfcode.common.core.controller.BaseController;
import cn.wolfcode.common.core.domain.AjaxResult;
import cn.wolfcode.common.core.page.TableDataInfo;
import cn.wolfcode.common.enums.BusinessType;
import cn.wolfcode.common.utils.poi.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 汽车服务项目管理控制器
 * 负责管理汽车维修保养的各种服务项目
 * 包括：服务项目的增删改查、上架下架、审核流程等功能
 * 
 * @author wolfcode
 * @date 2025-09-19
 */
@RestController  // REST风格控制器，返回JSON数据
@RequestMapping("/business/serviceltem")  // 访问路径前缀
public class BusServiceItemController extends BaseController
{
    // 注入服务项目业务逻辑处理类
    @Autowired
    private IBusServiceItemService busServiceItemService;

    /**
     * 查询服务项目列表
     * 支持分页查询和条件筛选，用于后台管理界面显示服务项目列表
     */
    @PreAuthorize("@ss.hasPermi('business:serviceltem:list')")  // 权限验证
    @GetMapping("/list")  // 处理GET请求
    public TableDataInfo list(BusServiceItem busServiceItem)
    {
        // 开始分页（从请求参数中获取页码和每页数量）
        startPage();
        // 调用业务层查询服务项目列表
        List<BusServiceItem> list = busServiceItemService.selectBusServiceItemList(busServiceItem);
        // 返回分页数据表格信息
        return getDataTable(list);
    }

    /**
     * 获取单个服务项目的详细信息
     * 用于查看或编辑服务项目时获取完整信息
     */
    @PreAuthorize("@ss.hasPermi('business:serviceltem:query')")  // 权限验证
    @GetMapping(value = "/{id}")  // 处理GET请求，{id}是路径参数
    public AjaxResult getInfo(@PathVariable("id") Long id)  // 获取路径中的id参数
    {
        // 调用业务层根据ID查询服务项目详情
        return AjaxResult.success(busServiceItemService.selectBusServiceItemById(id));
    }
    /**
     * 新增服务项目
     * 管理员可以添加新的汽车服务项目（如换机油、轮胎保养等）
     */
    @PreAuthorize("@ss.hasPermi('business:serviceltem:add')")  // 权限验证
    @PostMapping  // 处理POST请求，用于新增数据
    public AjaxResult add(@RequestBody BusServiceItem busServiceItem)  // 接收JSON格式的服务项目信息
    {
        // 调用业务层新增服务项目
        return toAjax(busServiceItemService.insertBusServiceItem(busServiceItem));
    }

    /**
     * 修改服务项目
     * 可以修改服务项目的名称、价格、描述等信息
     */
    @PreAuthorize("@ss.hasPermi('business:serviceltem:edit')")  // 权限验证
    @Log(title = "服务项", businessType = BusinessType.UPDATE)  // 记录操作日志
    @PutMapping  // 处理PUT请求，用于更新数据
    public AjaxResult edit(@RequestBody BusServiceItem busServiceItem)  // 接收修改后的服务项目信息
    {
        // 调用业务层更新服务项目
        return toAjax(busServiceItemService.updateBusServiceItem(busServiceItem));
    }

    /**
     * 批量删除服务项目
     * 管理员可以同时删除多个不需要的服务项目
     */
    @PreAuthorize("@ss.hasPermi('business:serviceltem:remove')")  // 权限验证
    @Log(title = "服务项", businessType = BusinessType.DELETE)  // 记录操作日志
    @DeleteMapping("/{ids}")  // 处理DELETE请求，{ids}支持多个ID
    public AjaxResult remove(@PathVariable Long[] ids)  // 接收要删除的服务项目ID数组
    {
        // 调用业务层批量删除服务项目
        return toAjax(busServiceItemService.deleteBusServiceItemByIds(ids));
    }

    /**
     * 服务项目上架操作
     * 将服务项目设为可用状态，客户可以预约此服务
     */
    @PatchMapping(value="/{id}",headers="cmd=saleOn")  // PATCH请求，通过header区分操作类型
    public AjaxResult saleOn(@PathVariable Long id)  // 获取要上架的服务项目ID
    {
        // 调用业务层执行上架操作
        return toAjax(busServiceItemService.saleOn(id));
    }

    /**
     * 服务项目下架操作
     * 将服务项目设为不可用状态，客户无法预约此服务
     */
    @PatchMapping(value="/{id}",headers="cmd=saleOff")  // PATCH请求，通过header区分操作类型
    public AjaxResult saleOff(@PathVariable Long id)  // 获取要下架的服务项目ID
    {
        // 调用业务层执行下架操作
        return toAjax(busServiceItemService.saleOff(id));
    }
    /**
     * 获取服务项目列表（不分页）
     * 用于下拉框选择或其他需要完整列表的场景
     */
    @GetMapping(value="/list", headers = "cmd=list")  // 通过header区分不同的list请求
    public AjaxResult getServiceItem(BusServiceItem busServiceItem){
        // 这里虽然调用了startPage()，但由于header不同，实际效果可能不同
        startPage();
        // 查询服务项目列表
        List<BusServiceItem> list = busServiceItemService.selectBusServiceItemList(busServiceItem);
        // 返回完整列表数据
        return AjaxResult.success(list);
    }

    /**
     * 获取审核信息
     * 为审核对话框准备数据，显示服务项目的审核相关信息
     */
    @GetMapping("/{id}/auditInfo")  // 获取指定服务项目的审核信息
    public AjaxResult getAuditInfo(@PathVariable("id") Long id)
    {
        // 调用业务层获取审核相关信息
        AuditInfoVO vo = busServiceItemService.getAuditInfo(id);
        return AjaxResult.success(vo);
    }

    /**
     * 发起审核流程
     * 管理员点击"提交审核"按钮时调用，启动工作流审批流程
     */
    @PostMapping("/startAudit")  // 处理POST请求
    public AjaxResult startAudit(@RequestBody AuditVo vo){  // 接收审核相关参数
        // 调用业务层启动审核流程
        return toAjax(busServiceItemService.startAudit(vo));
    }
}
